﻿using DevelopTool.Model;
using LiteDB;

namespace DevelopTool.Bll.LocalDbBlls
{
    /// <summary>
    /// 本地数据库LiteDb操作对象
    /// </summary>
    public sealed class LiteDbContext
    {
        /// <summary>
        /// LiteDb连接串
        /// </summary>
        public static ConnectionString ConnectionString
        {
            get
            {
                return new ConnectionString()
                {
                    Filename = LocalUser.DbFilePath,//完整路径或从DLL目录开始的相对路径。
                    Password = LocalUser.Password,//使用密码加密 (使用 AES) 你的数据文件 (默认: null - 无加密)

                    // Journal = false,//启用或禁用双写检查来确保持久性 (默认: true)
                    //CacheSize = 10000,//缓存中的最大页面数据。达到这个大小后，刷新数据到磁盘以防止占有太多内存 (默认: 5000)
                    // Timeout = TimeSpan.FromMinutes(1.0),//等待解锁操作的超时时间 (线程锁和文件锁)
                    // Mode = FileMode.Shared,//数据文件的打开方式 (默认: NET35中为 `Shared`，NetStandard中为 `Exclusive`)
                    //  InitialSize =0,//如果数据库是新建的，使用分配的空间初始化 - 支持 KB, MB, GB (默认: null)
                    // LimitSize = long.MaxValue,//数据文件的最大限制 - 支持 KB, MB, GB (默认: null)
                    // Upgrade=false,//如果是 true，尝试从老版本 (v2) 升级数据文件 (默认: null)
                    // Log = byte.MaxValue,//数据库的调试消息 - 在 `LiteDatabase.Log` (默认: Logger.NONE)
                    // Flush = true//直接将数据写入到磁盘，以阻止操作系统缓存 (在 NET35 下不可用，默认: false) (v4.1.2)
                };
            }
        }


        /// <summary>
        /// 删除表
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="filename"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public static bool DeleteTable(string tableName,string filename,string password)
        {
            ConnectionString connectionString = new ConnectionString()
            {
                Filename = filename,
                Password = password
            };

            using(var db = new LiteDatabase(connectionString))
            {
                return db.DropCollection(tableName);
            }
        }



        /// <summary>
        /// 重新排列数据库未使用的空间
        /// </summary>
        public static void ClearCache(string filename = null,string password = null)
        {
            ConnectionString connectionString = null;
            if(string.IsNullOrEmpty(filename))
            {
                connectionString = ConnectionString;
            }
            else
            {
                connectionString = new ConnectionString
                {
                    Filename = filename,
                    Password = password
                };
            }

            using(var db = new LiteDatabase(connectionString))
            {
                db.Shrink();//清理缓存
            }
        }
    }
}
